package com.vic.mvc.prepare.design.proxy.jdk;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Random;

public class DynamicByJdk implements InvocationHandler {

	Object target;

	/**
	 * 获得被代理后的对象 2016年7月18日 by 许秋冬
	 * 
	 * @return
	 */
	public Object getObject(Object obj) {
		this.target = obj;
		return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
	}

	/**
	 * 当用户调用对象中的每个方法时都通过下面的方法执行，方法必须在接口 proxy 被代理后的对象 method 将要被执行的方法信息（反射） args
	 * 执行方法时需要的参数
	 */
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		long start = System.currentTimeMillis();
		lazy();
		//使用反射在目标对象上调用方法并传入参数
		method.invoke(target, args);
		  long span= System.currentTimeMillis()-start;
		  System.out.println("共用时："+span);
		return null;
	}

	// 模拟延时
	public void lazy() {
		try {
			int n = (int) new Random().nextInt(500);
			Thread.sleep(n);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

}
